package com.anolesoft.yr.mbus.sup.service.impl;

import com.anolesoft.yr.mbus.part.dto.PartModelDTO;
import com.anolesoft.yr.mbus.part.entity.PartModelDO;
import com.anolesoft.yr.mbus.sup.dto.SupBaseDTO;
import com.anolesoft.yr.mbus.sup.dto.SupBasePartDTO;
import com.anolesoft.yr.mbus.sup.entity.SupBaseDO;
import com.anolesoft.yr.mbus.sup.entity.SupBasePartDO;
import com.anolesoft.yr.mbus.sup.mapper.SupBasePartMapper;
import com.anolesoft.yr.mbus.sup.service.SupBasePartService;
import com.anolesoft.yr.util.CommonUtils;
import com.anolesoft.yr.util.CustomBeanUtils;
import com.anolesoft.yr.util.PageData;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author zhj
 * @date 2020/8/24 14:03
 */
@Service("supBasePartServiceImpl")
public class SupBasePartServiceImpl implements SupBasePartService {
    @Autowired
    private SupBasePartMapper supBasePartMapper;

    @Transactional
    @Override
    public int create(SupBasePartDTO supBasePartDTO) {
        return supBasePartMapper.insert(SupBasePartDO.builder()
                .partModelUid(supBasePartDTO.getPartModelUid())
                .supBaseUid(supBasePartDTO.getSupBaseUid())
                .factoryCode(supBasePartDTO.getFactoryCode())
                .objuid(supBasePartDTO.getObjuid())
                .createTime(supBasePartDTO.getCreateTime())
                .createUserUid(supBasePartDTO.getCreateUserUid())
                .deleteFlag(supBasePartDTO.getDeleteFlag())
                .modifyTime(supBasePartDTO.getModifyTime())
                .modifyUserUid(supBasePartDTO.getModifyUserUid())
                .remark(supBasePartDTO.getRemark())
                .build());
    }

    @Transactional
    @Override
    public int modify(SupBasePartDTO supBasePartDTO) {
        SupBasePartDO supBasePartDO = supBasePartMapper.selectOneById(supBasePartDTO.getObjuid());
        if(supBasePartDO == null){
            supBasePartDO = SupBasePartDO.builder().build();
        }
        supBasePartDO.setPartModelUid(supBasePartDTO.getPartModelUid());
        supBasePartDO.setSupBaseUid(supBasePartDTO.getSupBaseUid());
        supBasePartDO.setObjuid(supBasePartDTO.getObjuid());
        return supBasePartMapper.update(supBasePartDO);
    }

    @Transactional
    @Override
    public int remove(String id) {
        return supBasePartMapper.delete(id);
    }

    @Transactional
    @Override
    public int removeBatch(List<String> ids) {
        int res = 0;
        for (String id : ids) {
            res += supBasePartMapper.delete(id);
        }
        return res;
    }

    @Override
    public Optional<SupBasePartDTO> selectOneById(String id) {
        SupBasePartDO supBasePartDO = supBasePartMapper.selectOneById(id);
        if (supBasePartDO != null) {
            return Optional.of(CustomBeanUtils.supBasePartDO2DTO(supBasePartDO));
        }
        return Optional.empty();
    }

    @Override
    public PageData<List<SupBasePartDTO>> selectPageList(SupBasePartDTO supBasePartDTO, Integer limit, Integer curr) {
        SupBasePartDO supBasePartDO = SupBasePartDO.builder()
                .partModelUid(supBasePartDTO.getPartModelUid())
                .supBaseUid(supBasePartDTO.getSupBaseUid())
                .build();
        Page<SupBasePartDO> page = new Page<>(curr, limit);
        List<SupBasePartDO> supBasePartDOS = supBasePartMapper.selectPageList(supBasePartDO, page);
        List<SupBasePartDTO> supBasePartDTOS = supBasePartDOS.stream().map(t -> CustomBeanUtils.supBasePartDO2DTO(t)).collect(Collectors.toList());
        return new PageData<>(((int) page.getTotal()), supBasePartDTOS);
    }

    @Override
    public PageData<List<SupBasePartDTO>> selectPageConditionList(SupBasePartDTO supBasePartDTO, Integer limit, Integer curr) {
        Page<SupBasePartDO> page = new Page<>(curr, limit);
        PartModelDO partModel = null;
        PartModelDTO model = supBasePartDTO.getPartModel();
        if(model != null){
            partModel = PartModelDO.builder()
                    .partTypeUid(CommonUtils.stringNull(model.getPartTypeUid()))
                    .partBrand(CommonUtils.warpStringNull(model.getPartBrand()))
                    .partName(CommonUtils.warpStringNull(model.getPartName()))
                    .partModel(CommonUtils.warpStringNull(model.getPartModel()))
                    .partCode(CommonUtils.warpStringNull(model.getPartCode()))
                    .partSpecification(CommonUtils.warpStringNull(model.getPartSpecification()))
                    .build();
        }
        SupBaseDO supBase = null;
        SupBaseDTO sup = supBasePartDTO.getSupBase();
        if (sup != null) {
            supBase = SupBaseDO.builder()
                    .supCode(CommonUtils.warpStringNull(sup.getSupCode()))
                    .supName(CommonUtils.warpStringNull(sup.getSupName()))
                    .supOtherName(CommonUtils.warpStringNull(sup.getSupOtherName()))
                    .build();
        }

        SupBasePartDO supBasePartDO = SupBasePartDO.builder()
                .partModelUid(supBasePartDTO.getPartModelUid())
                .supBaseUid(supBasePartDTO.getSupBaseUid())
                .objuid(supBasePartDTO.getObjuid())
                .partModel(partModel)
                .supBase(supBase)
                .build();
        List<SupBasePartDO> supBasePartDOS = supBasePartMapper.selectPageConditionList(supBasePartDO, page);
        List<SupBasePartDTO> supBasePartDTOS = supBasePartDOS.stream().map(t -> CustomBeanUtils.supBasePartDO2DTO(t)).collect(Collectors.toList());
        return new PageData<>(((int) page.getTotal()), supBasePartDTOS);
    }
}
